package com.ww.springboot.boot.javabase.proxy.javaInvocation;

import java.lang.reflect.Proxy;

/**
 * 描述： jdk 动态代理 底层使用反射
 *
 * 动态代理-》在静态代理的基础上,不需要用户实现 代理对象 由JDK使用反射 动态生成代理对象
 *
 * 动态代理:将对象A 经过动态代理披上对象B的外表,同时具备B的功能,且在每次调用B功能的时候触发A的invoke方法
 *
 * @author wanwei
 * @since 2021-07-08 17:09
 */
public class Run {
    public static void main(String[] args) throws InterruptedException {
        Person man = new Man();

        ManProxy manProxy = new ManProxy(man,"1");

        //创建一个对象 一个代理类 将代理类逻辑附加到对象上生成一个代理类 代理对象调用方法时就会触发代理类的逻辑
        //getInterfaces 获取实现的所有的接口
        Person person = (Person) Proxy.newProxyInstance(man.getClass().getClassLoader(), man.getClass().getInterfaces(), manProxy);

        //一层代理
        person.say("0");

        System.out.println("-------------");

        manProxy = new ManProxy(person,"2");

        Person person2 = (Person) Proxy.newProxyInstance(person.getClass().getClassLoader(), person.getClass().getInterfaces(), manProxy);
        //二层代理
        person2.say("1");
    }
}
